/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.endpoint.websocket;

import com.ejb.controlador.websocket.JugarController;
import com.endpoint.websocket.decoder.DecEvento;
import com.endpoint.websocket.encoder.EncSigEscenario;
import com.endpoint.websocket.util.Evento;
import com.endpoint.websocket.util.SigEscenario;
import com.ejb.negocio.JuegosFacade;
import com.ejb.persistencia.Juegos;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.websocket.EncodeException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

/**
 *
 * @author MoisesAntonio
 */

/* Websocket endpoint ¡¡¡Atención, hay una instancia de esta clase por cada conexión!!!*/
@ServerEndpoint(
        value = "/websocketjuego",
        decoders = { DecEvento.class }, 
        encoders = { EncSigEscenario.class}
        )
public class JuegoEndpoint{
    
    //Esta variable representa el controlador del juego.
    @EJB
    JuegosFacade ejbJuegos;
    
    //Esta variable solo la utilizo para saber que pasa en el flujo del servidor.
    //Es totalmente prescindible.
    private static final Logger logger = Logger.getLogger("JuegoLogger");
    
    @OnOpen
    public void openConnection(Session session) {
        logger.log(Level.INFO, "Connection opened.");
        
        session.getUserProperties().put("active", true);
        session.getUserProperties().put("juego", new JugarController());
    }

    @OnMessage
    public void message(final Session session, Evento eve){
        logger.log(Level.INFO, "Received: {0}", eve.toString());
        //session.getUserProperties().put("", msg.getName());
        //Hasta aquí esto funciona, es solo mensajes de texto
        JugarController juego=(JugarController)session.getUserProperties().get("juego");
        
        if(eve.getEscenario()==0){  //Si es la pantalla de carga
            Juegos j=ejbJuegos.find(eve.getPosX()); //Se recoge en la posX el id del juego
            if(j!=null){
                juego.setJuegoCargado(j);
                juego.cargarJuego();
                SigEscenario escenario=juego.cargarNivel();
                send(session, escenario);
                logger.log(Level.INFO, "Sent: {0}", escenario.toString());
            }else{
                logger.log(Level.INFO, "Sent: {0}", "El id del juego no es válido");
                SigEscenario escenario=new SigEscenario(-1);
                send(session,escenario);
            }
        }else{ //Si se realiza el impacto en el evento:
            if(juego.ejecutarEventos(eve.getPosX(), eve.getPosY())){
                //Cargamos el salto:
                SigEscenario escenario=juego.cargarNivel();
                send(session, escenario);
                logger.log(Level.INFO, "Sent: {0}", escenario.toString());
            
            }
        }
        
        //Sino, se ignora el mensaje.
        
        //Esto es para probar a enviar imágenes.
        //File f=new File("c:/pruebas/0.png");
        //send(session, f);
    }
    
    @OnClose
    public void closedConnection(Session session) {
        session.getUserProperties().put("active", false);
        logger.log(Level.INFO, "Connection closed.");
    }
    
    @OnError
    public void error(Session session, Throwable t) {
        logger.log(Level.INFO, "Connection error ({0})", t.toString());
    }
    
    /**
     * Este método se encarga de enviar el mensaje de respuesta al cliente.
     * @param session
     * @param msg 
     */
    public void send(Session session, Object msg){
        try {
            session.getBasicRemote().sendObject(msg);
            logger.log(Level.INFO, "Mensaje enviado.");
        }catch (IOException | EncodeException e){
            logger.log(Level.WARNING, e.toString());
        }
    }
    
}
